package ofdinv

import (
	"encoding/xml"
)

// CustomTagTransportRoot 表示货物运输服务发票的CustomTag.xml根结构，专用于货物运输发票解析
type CustomTagTransportRoot struct {
	XMLName                 xml.Name       `xml:"root"`                    // XML根元素，标识CustomTag.xml文档结构
	InvoiceNo               ObjectRefField `xml:"InvoiceNo"`               // 发票号码字段的ID引用
	IssueDate               ObjectRefField `xml:"IssueDate"`               // 开票日期字段的ID引用
	Buyer                   BuyerSection   `xml:"Buyer"`                   // 购买方信息段，包含购买方相关字段
	Seller                  SellerSection  `xml:"Seller"`                  // 销售方信息段，包含销售方相关字段
	TaxExclusiveTotalAmount ObjectRefField `xml:"TaxExclusiveTotalAmount"` // 合计金额（不含税）字段的ID引用
	TaxTotalAmount          ObjectRefField `xml:"TaxTotalAmount"`          // 合计税额字段的ID引用
	TaxInclusiveTotalAmount ObjectRefField `xml:"TaxInclusiveTotalAmount"` // 价税合计字段的ID引用
	InvoiceClerk            ObjectRefField `xml:"InvoiceClerk"`            // 开票人字段的ID引用
	TaxAmount               ObjectRefField `xml:"TaxAmount"`               // 税额字段的ID引用，货物运输发票特有
	MeasurementDimension    ObjectRefField `xml:"MeasurementDimension"`    // 计量单位字段的ID引用，货物运输发票特有
	Amount                  ObjectRefField `xml:"Amount"`                  // 金额字段的ID引用，货物运输发票特有
	Item                    ObjectRefField `xml:"Item"`                    // 项目名称字段的ID引用，货物运输发票特有
	TaxScheme               ObjectRefField `xml:"TaxScheme"`               // 税率字段的ID引用，货物运输发票特有
	Note                    ObjectRefField `xml:"Note,omitempty"`          // 备注字段的ID引用，可选字段
	// 运输明细五项字段 - 由于CustomTag.xml结构不完整，这些字段在XML中可能使用相同标签
	// 在实际解析时需要根据ID范围或上下文来区分
	VehicleType   ObjectRefField `xml:"VehicleType,omitempty"`   // 运输工具种类字段的ID引用，货物运输发票特有
	VehicleNumber ObjectRefField `xml:"VehicleNumber,omitempty"` // 运输工具牌号字段的ID引用，货物运输发票特有
	Departure     ObjectRefField `xml:"Departure,omitempty"`     // 起运地字段的ID引用，货物运输发票特有
	Destination   ObjectRefField `xml:"Destination,omitempty"`   // 到达地字段的ID引用，货物运输发票特有
	CargoName     ObjectRefField `xml:"CargoName,omitempty"`     // 运输货物名称字段的ID引用，货物运输发票特有
}

// FieldMappingsTransport 表示货物运输发票字段映射表，定义货物运输发票字段的ID映射关系
type FieldMappingsTransport struct {
	InvoiceNo               IDMapping `json:"invoice_no"`                      // 发票号码字段的ID映射
	IssueDate               IDMapping `json:"issue_date"`                      // 开票日期字段的ID映射
	BuyerName               IDMapping `json:"buyer_name"`                      // 购买方名称字段的ID映射
	BuyerTaxID              IDMapping `json:"buyer_tax_id"`                    // 购买方纳税人识别号字段的ID映射
	SellerName              IDMapping `json:"seller_name"`                     // 销售方名称字段的ID映射
	SellerTaxID             IDMapping `json:"seller_tax_id"`                   // 销售方纳税人识别号字段的ID映射
	TaxExclusiveTotalAmount IDMapping `json:"tax_exclusive_total_amount"`      // 合计金额（不含税）字段的ID映射
	TaxTotalAmount          IDMapping `json:"tax_total_amount"`                // 合计税额字段的ID映射
	TaxInclusiveTotalAmount IDMapping `json:"tax_inclusive_total_amount"`      // 价税合计字段的ID映射
	InvoiceClerk            IDMapping `json:"invoice_clerk"`                   // 开票人字段的ID映射
	TaxAmount               IDMapping `json:"tax_amount,omitempty"`            // 税额字段的ID映射（货物运输发票）
	MeasurementDimension    IDMapping `json:"measurement_dimension,omitempty"` // 计量单位字段的ID映射（货物运输发票）
	Amount                  IDMapping `json:"amount,omitempty"`                // 金额字段的ID映射（货物运输发票）
	Item                    IDMapping `json:"item,omitempty"`                  // 项目名称字段的ID映射（货物运输发票）
	TaxScheme               IDMapping `json:"tax_scheme,omitempty"`            // 税率字段的ID映射（货物运输发票）
	Note                    IDMapping `json:"note,omitempty"`                  // 备注字段的ID映射
	// 运输明细五项字段映射
	VehicleType   IDMapping `json:"vehicle_type,omitempty"`   // 运输工具种类字段的ID映射（货物运输发票）
	VehicleNumber IDMapping `json:"vehicle_number,omitempty"` // 运输工具牌号字段的ID映射（货物运输发票）
	Departure     IDMapping `json:"departure,omitempty"`      // 起运地字段的ID映射（货物运输发票）
	Destination   IDMapping `json:"destination,omitempty"`    // 到达地字段的ID映射（货物运输发票）
	CargoName     IDMapping `json:"cargo_name,omitempty"`     // 运输货物名称字段的ID映射（货物运输发票）
}

// TransportGoodsInfo 表示货物运输发票的商品信息明细
type TransportGoodsInfo struct {
	ID              int    `json:"id"`               // 序号
	ItemName        string `json:"item_name"`        // 项目名称
	MeasurementUnit string `json:"measurement_unit"` // 计量单位
	Quantity        string `json:"quantity"`         // 数量
	UnitPrice       string `json:"unit_price"`       // 单价
	Amount          string `json:"amount"`           // 金额
	TaxRate         string `json:"tax_rate"`         // 税率/征收率
	TaxAmount       string `json:"tax_amount"`       // 税额
}

// TransportDetail 表示货物运输发票的运输信息明细
type TransportDetail struct {
	ID            int    `json:"id"`             // 序号
	VehicleType   string `json:"vehicle_type"`   // 运输工具种类
	VehicleNumber string `json:"vehicle_number"` // 运输工具牌号
	Departure     string `json:"departure"`      // 起运地（可能包含多行文本）
	Destination   string `json:"destination"`    // 到达地（可能包含多行文本）
	CargoName     string `json:"cargo_name"`     // 运输货物名称
}

// TextObjectWithPosition 表示带位置信息的文本对象，用于解析
type TextObjectWithPosition struct {
	PageID    int     `json:"pageID"`     // 页面ID
	TextID    int     `json:"textID"`     // 文本对象ID
	Text      string  `json:"text"`       // 文本内容
	X         float64 `json:"x"`          // X坐标
	Y         float64 `json:"y"`          // Y坐标
	Width     float64 `json:"width"`      // 宽度
	Height    float64 `json:"height"`     // 高度
	Area      string  `json:"area"`       // 区域类型：goods（商品信息）或 transport（运输信息）
	RowIndex  int     `json:"row_index"`  // 行索引
	FieldType string  `json:"field_type"` // 字段类型
}

// CoordinateRange 表示坐标范围，用于分区
// type CoordinateRange struct {
// 	MinY float64 `json:"min_y"` // 最小Y坐标
// 	MaxY float64 `json:"max_y"` // 最大Y坐标
// 	Type string  `json:"type"`  // 区域类型
// }

// ParseResultTransport 表示货物运输发票解析结果
type ParseResultTransport struct {
	InvoiceInfo    *InvoiceInfo             `json:"invoice_info"`     // 发票基本信息
	GoodsInfos     []TransportGoodsInfo     `json:"goods_infos"`      // 商品信息明细
	TransportInfos []TransportDetail        `json:"transport_infos"`  // 运输信息明细
	RawTextObjects []TextObjectWithPosition `json:"raw_text_objects"` // 原始文本对象（用于调试）
}

// GoodsFieldBoundaries 存储商品信息字段的边界信息
type GoodsFieldBoundaries struct {
	ItemNameLeft         float64 // 项目名称左边界
	ItemNameRight        float64 // 项目名称右边界
	MeasurementUnitLeft  float64 // 单位左边界
	MeasurementUnitRight float64 // 单位右边界
	QuantityLeft         float64 // 数量左边界
	QuantityRight        float64 // 数量右边界
	UnitPriceLeft        float64 // 单价左边界
	UnitPriceRight       float64 // 单价右边界
	AmountLeft           float64 // 金额左边界
	AmountRight          float64 // 金额右边界
	TaxRateLeft          float64 // 税率左边界
	TaxRateRight         float64 // 税率右边界
	TaxAmountLeft        float64 // 税额左边界
	TaxAmountRight       float64 // 税额右边界
}

// TransportFieldBoundaries 存储运输信息字段的边界信息
type TransportFieldBoundaries struct {
	VehicleTypeLeft    float64 // 运输工具种类左边界
	VehicleTypeRight   float64 // 运输工具种类右边界
	VehicleNumberLeft  float64 // 运输工具牌号左边界
	VehicleNumberRight float64 // 运输工具牌号右边界
	DepartureLeft      float64 // 起运地左边界
	DepartureRight     float64 // 起运地右边界
	DestinationLeft    float64 // 到达地左边界
	DestinationRight   float64 // 到达地右边界
	CargoNameLeft      float64 // 运输货物名称左边界
	CargoNameRight     float64 // 运输货物名称右边界
}
